#include "board.h"
#include "console_timer.h"

#define  RCC_KEY_GPIO_PORT    RCC_AHB1Periph_GPIOE

/* 读取端口高低电平 */
#define __KEY_READ_IO(KEY)    GPIO_ReadInputDataBit(KEY->gpio_port,KEY->gpio_pin)

struct key_selc set_key1 =   {GPIOE,GPIO_Pin_1,1};
struct key_selc set_key2 =   {GPIOE,GPIO_Pin_2,2};
struct key_selc set_key3 =   {GPIOE,GPIO_Pin_3,3};
struct key_selc set_key4 =   {GPIOE,GPIO_Pin_4,4};
struct key_selc set_key5 =   {GPIOE,GPIO_Pin_5,5};

key_t key1 = &set_key1;
key_t key2 = &set_key2;
key_t key3 = &set_key3;
key_t key4 = &set_key4;
key_t key5 = &set_key5;

static void key_lowlever_init(key_t user_key)
{
    RCC_AHB1PeriphClockCmd(RCC_KEY_GPIO_PORT, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = user_key->gpio_pin;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(user_key->gpio_port, &GPIO_InitStructure);

    GPIO_WriteBit(user_key->gpio_port, user_key->gpio_pin, Bit_SET);
}

// 使用按键前需调用此函数初始化
void key_init(void)
{
    key_lowlever_init(key1);
    key_lowlever_init(key2);
    key_lowlever_init(key3);
    key_lowlever_init(key4);
    key_lowlever_init(key5);
}

// 调用函数判断是哪个按键按下，按下返回true,否则false
bool key_press(key_t user_key_x)
{
    if(__KEY_READ_IO(user_key_x) == 0)
    {
        timer_delay_ms(10);
        while(__KEY_READ_IO(user_key_x) == 0);
        timer_delay_ms(10);
        return true;
    }
    return false; 
}

